/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.fasepa.sgpf.bean;

import br.gov.fasepa.sgpf.entity.Bairro;
import br.gov.fasepa.sgpf.entity.Endereco;
import br.gov.fasepa.sgpf.entity.Estado;
import br.gov.fasepa.sgpf.entity.Municipio;
import br.gov.fasepa.sgpf.entity.Servidor;
import br.gov.fasepa.sgpf.entity.Unidade;
import br.gov.fasepa.sgpf.rn.BairroRN;
import br.gov.fasepa.sgpf.rn.EnderecoRN;
import br.gov.fasepa.sgpf.rn.EstadoRN;
import br.gov.fasepa.sgpf.rn.MunicipioRN;
import br.gov.fasepa.sgpf.rn.ServidorRN;
import br.gov.fasepa.sgpf.rn.UnidadeRN;
import br.gov.fasepa.sgpf.util.CepWebService;
import br.gov.fasepa.sgpf.util.JsfUtil;
import br.gov.fasepa.sgpf.util.SystemUtil;
import br.gov.fasepa.sgpf.util.Validator;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;

/**
 *
 * @author marcosdj
 */
@ManagedBean
@ViewScoped
public class UnidadeBean extends UnidadeRN implements Serializable {

    private Unidade unidade = new Unidade();
    private Validator validator = new Validator();
    private List<Unidade> unidades;
    private List<Servidor> servidores;
    private List<Municipio> sugestoesMunicipio;
    private List<Estado> sugestoesEstado;
    private List<Bairro> sugestoesBairro;
    private List<Municipio> munporestado;
    private List<Bairro> bairropmunicipio;
    private List<Estado> estados = new EstadoRN().obtainAll(Estado.class);
    private MunicipioRN mrn = new MunicipioRN();
    private BairroRN brn = new BairroRN();
    private EstadoRN ern = new EstadoRN();
    private String tipoLogradouro;
    private String logradouro;
    private String estado;
    private String cidade;
    private String bairro;
    private String cep = null;
    private String endereco;
    private String titulo;

    public void encontraCEP() {
        CepWebService cepWebService = new CepWebService(getCep());

        if (cepWebService.getResultado() == 1) {
            setTipoLogradouro(cepWebService.getTipoLogradouro());
            setLogradouro(cepWebService.getLogradouro());
            setEstado(cepWebService.getEstado());
            setCidade(cepWebService.getCidade());
            setBairro(cepWebService.getBairro());

            Estado e = new EstadoRN().obterPorUF(estado);
            if (e != null) {
                unidade.setEstado(e);
            }

            Municipio m = new MunicipioRN().obterPorNome(cidade);
            if (m != null) {
                unidade.setMunicipio(m);
            } else {
                m = new Municipio();
                m.setNome(cidade);
                m.setEstadoId(e);
                if (e.getMunicipioList() == null) {
                    e.setMunicipioList(new ArrayList<Municipio>());
                }
                e.getMunicipioList().add(m);
                if (e.getId() != null) {
                    ern.edit(e);
                } else {
                    ern.save(e);
                }
            }

            Bairro b = new BairroRN().obterPorNome(bairro);
            if (b != null) {
                unidade.setBairro(b);
            } else {
                b = new Bairro();
                b.setNome(bairro);
                b.setMunicipio(m);
                if (m.getBairroList() == null) {
                    m.setBairroList(new ArrayList<Bairro>());
                }
                m.getBairroList().add(b);
                if (m.getId() != null) {
                    mrn.edit(m);
                    System.out.println("Editou Município");
                } else {
                    System.out.println("Salvou Município ");
                    mrn.save(m);
                }
                b = null;
            }
            if (!cep.trim().equals("")) {
                Endereco en = new EnderecoRN().obterPorCEP(cep);
                Bairro bb = new BairroRN().obterPorNome(bairro);
                if (en == null) {
                    en = new Endereco();
                    en.setCep(cep);
                    en.setLogradoudo(logradouro);
                    en.setTipoLogradouro(tipoLogradouro);
                    en.setBairro(bb);
                    if (bb.getEnderecoList() == null) {
                        bb.setEnderecoList(new ArrayList<Endereco>());
                    }
                    bb.getEnderecoList().add(en);
                    brn.edit(bb);
                    bb = null;
                }
            }

            Municipio mtemp = mrn.obtain(Municipio.class, m.getId());
            Bairro btemp = brn.obterPorNome(bairro);
            String tempEndereco = tipoLogradouro + " " + logradouro;
            unidade.setMunicipio(mtemp);
            unidade.setBairro(btemp);
            unidade.setEndereco(tempEndereco);
            unidade.setCep(cep);

        } else {
            Endereco etemp = new EnderecoRN().obterPorCEP(cep);
            if (etemp != null) {
                logradouro = etemp.getLogradoudo();
                tipoLogradouro = etemp.getTipoLogradouro();
                unidade.setBairro(etemp.getBairro());
                unidade.setMunicipio(etemp.getBairro().getMunicipio());
                unidade.setEstado(etemp.getBairro().getMunicipio().getEstadoId());
            } else {
                RequestContext.getCurrentInstance().addCallbackParam("flag", "nocep");
                logradouro = null;
                tipoLogradouro = null;
                cep = null;
            }
        }
    }

    public UnidadeBean() {
        this.titulo = "CADASTRAR UNIDADE";
        if (JsfUtil.getSession().getAttribute("UC") != null) {
            Object[] array = (Object[]) JsfUtil.getSession().getAttribute("UC");
            if (array[1] instanceof Unidade) {
                this.unidade = (Unidade) array[1];
                this.cep = unidade.getCep();
            }
            this.titulo = "ALTERAR CADASTRO DE UNIDADE";
        }

    }

    public String irCadUnidade() {
        validator.verificaSessao();
        return "/sistema/unidade/cadastro.xhtml?faces-redirect=true";
    }

    public String irLista() {
        validator.verificaSessao();
        return "/sistema/unidade/lista.xhtml?faces-redirect=true";
    }

    public String alterar() {
        return "/sistema/unidade/cadastro.xhtml?faces-redirect=true";
    }

    public void putInSession(Unidade und) throws Exception {
        SystemUtil.updateUseCase(und, Unidade.class);
    }

    public void verificaCamposDialog() {
        if (validarCampos()) {
            RequestContext.getCurrentInstance().addCallbackParam("flag", "salvar");
        } else {
            RequestContext.getCurrentInstance().addCallbackParam("flag", "nok");
        }
    }

    public void salvar() {
        if (JsfUtil.getSession().getAttribute("UC") == null) {
            save(unidade);
        } else {
            edit(unidade);
        }
        unidade = null;
        cep = null;
        RequestContext.getCurrentInstance().addCallbackParam("flag", "ok");
        validator.verificaSessao();
    }

    public void cancelar() throws IOException {
        validator.verificaSessao();
        unidade = new Unidade();
        this.titulo = "CADASTRAR UNIDADE";
    }

    public List<Municipio> autoCompleteMunicipio(String query) {
        munporestado = new MunicipioRN().obtainAll(Municipio.class
        );
        sugestoesMunicipio = new ArrayList<>();
        if (munporestado
                != null) {
            for (Municipio m : munporestado) {
                if (m.getNome().toLowerCase().contains(query.toLowerCase())) {
                    sugestoesMunicipio.add(m);
                }
            }
        }
        return sugestoesMunicipio;
    }

    public List<Estado> autoCompleteEstado(String query) {
        sugestoesEstado = new ArrayList<>();
        if (estados != null) {
            for (Estado es : estados) {
                if (es.getNome().toLowerCase().contains(query.toLowerCase())) {
                    sugestoesEstado.add(es);
                }
            }
        }
        return sugestoesEstado;
    }

    public List<Bairro> autoCompleteBairro(String query) {
        bairropmunicipio = new BairroRN().obtainAll(Bairro.class
        );
        sugestoesBairro = new ArrayList<>();
        if (bairropmunicipio
                != null) {
            for (Bairro b : bairropmunicipio) {
                if (b.getNome().toLowerCase().contains(query.toLowerCase())) {
                    sugestoesBairro.add(b);
                }
            }
        }
        return sugestoesBairro;
    }

    public boolean validarCampos() {
        boolean resposta = true;
        if (unidade.getNome().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgNome",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Nome é obrigatório", ""));
            resposta = false;
        }

        if (unidade.getSigla().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgSigla",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Sigla é obrigatório", ""));
            resposta = false;
        }

        if (unidade.getEndereco().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgEndereco",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo endereco é obrigatório", ""));
            resposta = false;

        }

        if (unidade.getMunicipio() == null) {
            FacesContext.getCurrentInstance().
                    addMessage("msgMunicipio",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Município é obrigatório", ""));
            resposta = false;

        }

        if (unidade.getEstado() == null) {
            FacesContext.getCurrentInstance().
                    addMessage("msgEstado",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Estado é obrigatório", ""));
            resposta = false;

        }

        if (unidade.getBairro() == null) {
            FacesContext.getCurrentInstance().
                    addMessage("msgBairro",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Bairro é obrigatório", ""));
            resposta = false;

        }

        if (unidade.getResponsavel() == null) {
            FacesContext.getCurrentInstance().
                    addMessage("msgResponsavel",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Responsável é obrigatório", ""));
            resposta = false;

        }
        
        if (unidade.getResponsavel()!= null) {            
            if (validator.isResponsavel(unidade.getResponsavel())) {
                FacesContext.getCurrentInstance().
                        addMessage("msgResponsavel",
                                new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Servidor já é responsável por alguma unidade ou setor", ""));
                resposta = false;

            }
        }
        
        if (!unidade.getEmail().trim().equals("")) {
            if (!validator.validEmail(unidade.getEmail().trim())) {
                FacesContext.getCurrentInstance().
                        addMessage("msgEmail",
                                new FacesMessage(FacesMessage.SEVERITY_ERROR, "O campo Email é inválido", ""));                
                resposta = false;
            }
        }

        return resposta;
    }

    public Unidade getUnidade() {
        return unidade;
    }

    public void setUnidade(Unidade unidade) {
        this.unidade = unidade;
    }

    public Validator getValidator() {
        return validator;
    }

    public void setValidator(Validator validator) {
        this.validator = validator;
    }

    public List<Unidade> getUnidades() {
        if (unidades == null) {
            unidades = obtainAll(Unidade.class);
        }
        return unidades;
    }

    public void setUnidades(List<Unidade> unidades) {
        this.unidades = unidades;
    }

    public List<Servidor> getServidores() {
        List<Servidor> stemp = new ServidorRN().obtainAll(Servidor.class);
        if (stemp != null) {
            servidores = stemp;
        }
        return servidores;
    }

    public void setServidores(List<Servidor> servidores) {
        this.servidores = servidores;
    }

    public String getTipoLogradouro() {
        return tipoLogradouro;
    }

    public void setTipoLogradouro(String tipoLogradouro) {
        this.tipoLogradouro = tipoLogradouro;
    }

    public String getLogradouro() {
        return logradouro;
    }

    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public String getCidade() {
        return cidade;
    }

    public void setCidade(String cidade) {
        this.cidade = cidade;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public List<Municipio> getSugestoesMunicipio() {
        return sugestoesMunicipio;
    }

    public void setSugestoesMunicipio(List<Municipio> sugestoesMunicipio) {
        this.sugestoesMunicipio = sugestoesMunicipio;
    }

    public List<Estado> getSugestoesEstado() {
        return sugestoesEstado;
    }

    public void setSugestoesEstado(List<Estado> sugestoesEstado) {
        this.sugestoesEstado = sugestoesEstado;
    }

    public List<Bairro> getSugestoesBairro() {
        return sugestoesBairro;
    }

    public void setSugestoesBairro(List<Bairro> sugestoesBairro) {
        this.sugestoesBairro = sugestoesBairro;
    }

    public List<Municipio> getMunporestado() {
        return munporestado;
    }

    public void setMunporestado(List<Municipio> munporestado) {
        this.munporestado = munporestado;
    }

    public List<Bairro> getBairropmunicipio() {
        return bairropmunicipio;
    }

    public void setBairropmunicipio(List<Bairro> bairropmunicipio) {
        this.bairropmunicipio = bairropmunicipio;
    }

    public List<Estado> getEstados() {
        return estados;
    }

    public void setEstados(List<Estado> estados) {
        this.estados = estados;
    }

    public MunicipioRN getMrn() {
        return mrn;
    }

    public void setMrn(MunicipioRN mrn) {
        this.mrn = mrn;
    }

}
